package com.agent.ai.controller;

import com.agent.ai.services.LoggingAdvisor;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.vectorstore.SearchRequest;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.LocalDate;
import java.util.HashMap;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;


/**
 * @author xushu
 * @version 1.0
 * @description:
 */
@RestController
@CrossOrigin
public class OpenAiController {

    private final ChatClient chatClient;

    public OpenAiController(ChatClient.Builder chatClientBuilder, VectorStore vectorStore, ChatMemory chatMemory) {
        this.chatClient = chatClientBuilder
				.defaultSystem("""
					   您是请假申请功能的只能助手。请以友好、乐于助人且愉快的方式来回复。
					   每次回复用户之前请务必遵守请假申请条款。
					   您正在通过在线聊天系统与客户互动。
					   如果需要，可以调用相应函数调用完成辅助动作。
					   请讲中文。
					   申请人就是我的账号。申请人部门就是我的部门。
					   今天的日期是 {current_date}。
					   我的姓名和账号是 {login_user_name}。
					   我的部门是 {login_dept_name}。
					   我的部门id是 {login_dept_id}。
					   我的账号id是 {login_user_id}，账号id不需要向用户透露。
					""")
                .defaultAdvisors(
                        new PromptChatMemoryAdvisor(chatMemory),  // 添加对话记忆
						new QuestionAnswerAdvisor(vectorStore, SearchRequest.defaults()), // 添加本地存储
                        new LoggingAdvisor())
				.defaultFunctions("submitQjsqUser", "selectQjByIdNew", "nextTasksByNodeIdNew", "taskComplete", "getFlowUserByNodeIdNew") // 设置方法回调
				.build();


	}


    @CrossOrigin
    @GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generateStreamAsString(
			@RequestParam(value = "message", defaultValue = "讲个笑话") String message,
			@RequestParam(value = "userName") String userName,
			@RequestParam(value = "deptName") String deptName,
			@RequestParam(value = "userId") String userId,
			@RequestParam(value = "deptId") String deptId
	) {
		HashMap<String, Object> map = new HashMap<>();
		// 设置提示词中的数据
		map.put("current_date", LocalDate.now().toString()); // 设置当前时间
		map.put("login_user_name", userName); // 设置当前用户
		map.put("login_user_id", userId); // 设置当前用户id
		map.put("login_dept_name", deptName); // 设置当前用户id
		map.put("login_dept_id", deptId); // 设置当前用户id

		Flux<String> content = chatClient.prompt()
                .system(s -> s.params(map))
                .advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                .user(message)
                .stream()
                .content();

        return  content
                .concatWith(Flux.just("[complete]"));

    }


}
